Operating systems are programs that run on a computer to provide a standard interface between the computer hardware and application programs that must run on that computer.
For example, the "DOS" operating system ("Disk Operating System") and its successor "Windows" operating systems which are both commonly used on desk-top, PC-style computers, provide a set of standard operations that may be invoked by an application program to perform routine tasks associated with controlling the computer hardware. These popular operating systems, for example, both provide one or more operations to read information from a disk drive. The operating system operations require relatively few arguments, for example, a name of a logical disk drive, a name of the file to be read, and a name of a variable to which the file is to be returned. The operating system reads the file then returns its values to the predesignated variable. In this way, a programmer, who is writing an application program that requires information off a disk drive, can avoid the laborious and varying mechanics of reading a disk drive which may require many additional steps including interpreting the disk directory to find out which disk sectors hold the information desired, connecting the information in disjoint sectors into a file, and observing the complex steps of activating the disk drive motors and read heads to read the desired sectors in order.
The operating system operations are accessed through an API ("application programmer's interface"). The API may expose one or more function calls (like those used to access a hard disk). The application programmer can access those API-exposed operations with programming languages like C or Pascal. On a machine level, the operating system operations are invoked by branching to a particular location of the operating system, either directly or via an interrupt vector, after the necessary arguments are placed in a known location in memory, such as particular registers or the stack. When the operation is complete, the operating system returns the desired values to the predetermined memory locations and branches back to the point in the application program where the operating system operation was invoked.
Complex operating systems may have over 5,000 operating system operations providing for not only the reading and writing to disk drives, described above, but the printing of data to printers, the controlling of modems, the opening and closing of windows displayed on the computer monitors, and the managing of the execution of multiple application programs in a multi-tasking environment.
The use of an operating system not only simplifies the application programmer's tasks, but importantly creates a uniform software environment for developing application programs that are independent of the particular hardware on which the application is to be run. This increases the "portability" of application programs between computers with different configurations of hardware, different generations of a particular computer family, and in some cases different computer families. Care is taken that a program written for an earlier version of an operating system will run on later versions of the operating system, so that obsolescence of the application programs may be reduced.
In part by shielding the application developer from changes in computer hardware, operating systems have encouraged the creation of powerful and flexible software development tools. For example, a number of major software suppliers provide compilers for the Windows operating system. These compilers allow application developers to write applications in the latest high level computer languages, compile them for the Windows operating system, and to be ensured that the application program can then run on any of a large number of computers using the Windows operating system. In addition to compilers, a host of other development tools are available for the popular operating systems including those that assist a programmer in editing and troubleshooting compiled programs.
Conversely, it is true that many development systems using higher level languages, which can significantly reduce application development time, are available only for the latest generation of complex operating systems. This presents a problem for the development of application programs intended for computers embedded in products, for example, video equipment or home appliances. Typically, these embedded computers do not have a full complement of peripherals associated with them. For example, an embedded computer normally will not have disk drives but may rely entirely on programs and data contained in read-only memory, and may not support a standard computer keyboard or display, but may use a limited display and a small number of buttons for inputting. Most importantly, such embedded computers have limited memory.
As the complexity of programming embedded computers increases, it would be desirable to use high level programming languages and tools developed for general purpose desk-top computers running complex operating systems. Unfortunately, for application programs developed by these tools to run, it is necessary that the complex operating system be loaded into the memory of the embedded computer along with the application program. Such operating systems require many megabytes of memory for storage and are therefore impractical for most embedded computer applications.